fix(agent): filter SDK metadata from messages/partial events#102
Merged
Conversation
normalizeMessages() had two code paths: event['messages'] (returned
unfiltered) and event['data'] (filtered by isMessageLike). In
production, FetchStreamTransport's normalizeSdkEvent wraps the raw SDK
data array—which includes metadata objects like { langgraph_node,
langgraph_triggers }—into event.messages. These metadata objects lack
content/type/id fields, causing messageContent() to return undefined
and crashing the content classifier's detectType() on
undefined.length.
The fix applies the existing isMessageLike filter to the
event['messages'] path. Tests now simulate post-normalization event
shapes matching what FetchStreamTransport produces.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
messages/partialevents include metadata objects (e.g.{ langgraph_node, langgraph_triggers }) alongside real messages.normalizeMessages()had an unfilteredevent['messages']code path that let these through, causing metadata to accumulate in the messages array and crash the content classifier (undefined.lengthTypeError), breaking all streaming chat rendering.isMessageLikefilter to theevent['messages']code path, matching the behavior already used for theevent['data']path.normalizeSdkEventevent shapes (the production code path thatMockAgentTransportbypasses), proving metadata is filtered and doesn't accumulate across partial events.Root cause
normalizeMessages()instream-manager.bridge.tshad two code paths:event['messages']exists → returned unfiltered (production path viaFetchStreamTransport)event['data']exists → filtered byisMessageLike(test path viaMockAgentTransport)Tests only exercised path 2, so the bug in path 1 was invisible.
Test plan
nx test agent— 35/35 pass (includes 3 new tests)nx test chat— 175/175 pass🤖 Generated with Claude Code